import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import java.util.StringTokenizer;

import com.dp1.deliversoft.algorithm.AlgoritmoParticionZonas;
import com.dp1.deliversoft.algorithm.Grasp2;
import com.dp1.deliversoft.algorithm.rutear;
import com.dp1.deliversoft.entidad.Constantes;
import com.dp1.deliversoft.entidad.Mapa;
import com.dp1.deliversoft.entidad.Pedido;
import com.dp1.deliversoft.entidad.Ruta;
import com.dp1.deliversoft.entidad.TablaRuteoAux;
import com.dp1.deliversoft.entidad.Vehiculo;

public class MainB {

	ArrayList<Pedido> pedidos;
	Mapa mapita;
	

	public static void main(String[] args) {
		int n = 5;
		double ct=0;
		Ruta S;
		
		int ancho_mapa = 30;
		int alto_mapa = 25;
		int almacen_pos_x = 10;
		int almacen_pos_y = 5;
		int pedidos_cantidad = 40;
		
		/*ESTE BLOQUE SE PUSO PARA PROBAR LAS HORMIGAS: BONNIE*/
		
		//CARGAR MAPA
		Mapa mapita = new Mapa(ancho_mapa, alto_mapa);
		mapita.colocarAlmacen(almacen_pos_x, almacen_pos_y);
		
		//CARGAR PEDIDOS
		//ArrayList<Pedido> pedidos=crearPedidos();
		//muestraPedidos(pedidos);
		ArrayList<Pedido> p = crearPedidos2(pedidos_cantidad, mapita);
		
		//CARGAR VEHICULOS
		ArrayList<Vehiculo> vehiculos=GeneraVehiculos();
		
		//CALCULAR SALIDA
		TablaRuteoAux tabAux = new TablaRuteoAux(p, mapita);
		//tabAux.dibujar(p);
		rutear rt = new rutear();
		S = rt.GeneraRuta(25, p, false, mapita, tabAux);
		
		//ACTUALIZA EL MAPA
		for (int i = 0; i < S.getPedidos().size(); i++) {
			try
			{
				//System.out.println("bien"+i+"x: "+S.getPedidos().get(i).getPosX()+"y: "+S.getPedidos().get(i).getPosY());
				mapita.colocarCasa(S.getPedidos().get(i).getPosX()+1, S
						.getPedidos().get(i).getPosY()+1, "" + i);
			}
			catch (Exception e)
			{
				System.out.println("error"+i+"x: "+S.getPedidos().get(i).getPosX()+"y: "+S.getPedidos().get(i).getPosY());
			}
			
			// System.out.println("pedidos.add(new Pedido("+(S.getPedidos().get(i-1).getPosX()+1)+","+(S.getPedidos().get(i-1).getPosY()+1)+", 1, 1, 1));");
			
		}
		mapita.dibujarMapa();
		
		//zonas = rt.ParticionarEnZonas(zonas, S);
		AlgoritmoParticionZonas ar=new AlgoritmoParticionZonas(mapita);
		ArrayList<Ruta> zonas = ar.particionarRutaSimp(S);	
		
		for (Ruta ruta : zonas)
		{
			mapita.reiniciarMapa();
			for (int i = 0; i < ruta.getPedidos().size(); i++) {
				try
				{
					//System.out.println("bien"+i+"x: "+S.getPedidos().get(i).getPosX()+"y: "+S.getPedidos().get(i).getPosY());
					mapita.colocarCasa(ruta.getPedidos().get(i).getPosX()+1, ruta
							.getPedidos().get(i).getPosY()+1, "" + i);
				}
				catch (Exception e)
				{
					System.out.println("error"+i+"x: "+ruta.getPedidos().get(i).getPosX()+"y: "+ruta.getPedidos().get(i).getPosY());
				}
				
				// System.out.println("pedidos.add(new Pedido("+(S.getPedidos().get(i-1).getPosX()+1)+","+(S.getPedidos().get(i-1).getPosY()+1)+", 1, 1, 1));");
			}
			mapita.dibujarMapa();
		}
			//ruta.setPedidos(rt.GeneraRuta(20, ruta.getPedidos(), false, mapita, tabAux).getPedidos());
			//rt.reiniciarEstados(ruta.getPedidos());
			//ruta = Grasp2.GraspPrincipal(ruta.getPedidos(), mapita);
			
			/*for (int i = 0; i < ruta.getPedidos().size(); i++) {
				try
				{
					//System.out.println("bien"+i+"x: "+S.getPedidos().get(i).getPosX()+"y: "+S.getPedidos().get(i).getPosY());
					mapita.colocarCasa(ruta.getPedidos().get(i).getPosX()+1, ruta
							.getPedidos().get(i).getPosY()+1, "" + i);
				}
				catch (Exception e)
				{
					System.out.println("error"+i+"x: "+ruta.getPedidos().get(i).getPosX()+"y: "+ruta.getPedidos().get(i).getPosY());
				}
				
				// System.out.println("pedidos.add(new Pedido("+(S.getPedidos().get(i-1).getPosX()+1)+","+(S.getPedidos().get(i-1).getPosY()+1)+", 1, 1, 1));");
			}
			mapita.dibujarMapa();
			*/
			/*
			
			for (int i = 0; i < ruta.getPedidos().size(); i++) {
				try
				{
					//System.out.println("bien"+i+"x: "+S.getPedidos().get(i).getPosX()+"y: "+S.getPedidos().get(i).getPosY());
					mapita.colocarCasa(ruta.getPedidos().get(i).getPosX()+1, ruta
							.getPedidos().get(i).getPosY()+1, ".");
				}
				catch (Exception e)
				{
					System.out.println("error"+i+"x: "+ruta.getPedidos().get(i).getPosX()+"y: "+ruta.getPedidos().get(i).getPosY());
				}
				
				// System.out.println("pedidos.add(new Pedido("+(S.getPedidos().get(i-1).getPosX()+1)+","+(S.getPedidos().get(i-1).getPosY()+1)+", 1, 1, 1));");
			}*/
				

				
				
				// Se muestra el mapa

				// mapita.dibujarMapa();
					
		/* -------------------FIN BLOQUE BONNIE------------------------*/


	}

	public static void hardcodearPedidos(ArrayList<Pedido> pedidos) {
		pedidos.add(new Pedido(26, 2, 1, 1, 1));
		pedidos.add(new Pedido(26, 3, 1, 1, 1));
		pedidos.add(new Pedido(26, 9, 1, 1, 1));
		/*
		 * pedidos.add(new Pedido(31,11, 1, 1, 1)); pedidos.add(new Pedido(35,8,
		 * 1, 1, 1)); pedidos.add(new Pedido(34,7, 1, 1, 1)); pedidos.add(new
		 * Pedido(34,2, 1, 1, 1)); pedidos.add(new Pedido(34,16, 1, 1, 1));
		 * pedidos.add(new Pedido(34,30, 1, 1, 1)); pedidos.add(new
		 * Pedido(30,31, 1, 1, 1)); pedidos.add(new Pedido(22,31, 1, 1, 1));
		 * pedidos.add(new Pedido(20,31, 1, 1, 1)); pedidos.add(new
		 * Pedido(20,35, 1, 1, 1)); pedidos.add(new Pedido(17,29, 1, 1, 1));
		 * pedidos.add(new Pedido(11,23, 1, 1, 1)); pedidos.add(new Pedido(9,23,
		 * 1, 1, 1)); pedidos.add(new Pedido(8,22, 1, 1, 1)); pedidos.add(new
		 * Pedido(9,20, 1, 1, 1)); pedidos.add(new Pedido(23,22, 1, 1, 1));
		 */
	}

	
	
	public static void paraProbarGrasp() {
		// esto solo es para probar directamente el grasp
		Ruta r;
		System.out.println("Iniciando el grasp");
		// r=Grasp.GraspPrincipal(pedidos, mapita);
		// generadorRuta.inicializarVehiculos();
		// r = generadorRuta.rutearPedidos(mapita, pedidos, tabAux).get(0);
	}

	public static void codCarlos() {
		// creamos lista de vehiculos
		ArrayList<Vehiculo> vehiculos = GeneraVehiculos();
	}


/*	public static void paraProbarGrasp() {
		// esto solo es para probar directamente el grasp
		Ruta r;
		//System.out.println("Iniciando el grasp");
		
		for (int i=0;i<50;i++)
		{
			Date d = new Date();
			long ti,tf;
		
			
			
			mapita = new Mapa(150, 100);
			mapita.colocarAlmacen(0, 0);
			pedidos = crearPedidos(10);
			ti=d.getTime();
			Calendar ahora1 = Calendar.getInstance();
			long tiempo1 = ahora1.getTimeInMillis();
			
			r=Grasp.GraspPrincipal(pedidos, mapita);
			
			Calendar ahora2 = Calendar.getInstance();
			long tiempo2 = ahora2.getTimeInMillis();
			
			tf=d.getTime();
			muestraRuta(r);
			System.out.println(tiempo2 - tiempo1);
			
		}
		
}*/

	public static void muestraRuta(Ruta r) {
		ArrayList<Pedido> salida;
		salida = r.getPedidos();
		System.out.println("tipo de vehiculo "+ r.getVehiculo().getIdVehiculo()+" capacidad "+r.getVehiculo().getCapCarga()+" paquetes "+r.getVehiculo().getCarga());
		System.out.println("horas de retraso "+r.getHorasRetraso());
		muestraPedidos(salida);
		System.out.println("costo " + r.getCostoRuta());
	}
	
	public static void muestraPedidos(ArrayList<Pedido> salida)
	{
		for (int i = 0; i < salida.size(); i++) {
			System.out.println("codigo " + salida.get(i).getIdCliente() + " "
					+ salida.get(i).getPosX() + "," + salida.get(i).getPosY()
					+ "," + salida.get(i).getPlazo() + ","
					+ salida.get(i).getCantPaquetes());
		}
	}

	public static ArrayList<Pedido> crearPedidos() {

		int i = 0;
		ArrayList<Pedido> pedidos = new ArrayList<Pedido>();
		String cad, s1, s2, s3, s4;
		try {
			BufferedReader Entrada = new BufferedReader(new FileReader(
					"C:/pedidos.txt"));

			while ((cad = Entrada.readLine()) != null) {
				// System.out.println(""+1);
				StringTokenizer st = new StringTokenizer(cad, ",");

				s1 = (String) st.nextToken();
				s2 = (String) st.nextToken();
				s3 = (String) st.nextToken();
				s4 = (String) st.nextToken();
				pedidos.add(new Pedido(Integer.parseInt(s1), Integer
						.parseInt(s2), Integer.parseInt(s4), Integer
						.parseInt(s3), i));
				i++;
				
				//if (i==10) break;
			}

		} catch (Exception e) {

		}

		return pedidos;
	}

	public static ArrayList<Pedido> crearPedidos2(int n, Mapa mapita) {
		Random rn = new Random();
		Random rp = new Random();
		int max = 20, t, i = 0;
		ArrayList<Pedido> pedidos = new ArrayList<Pedido>();
		int x;
		int y;

		for (int m = 0; m < n; m++) {
			x = rn.nextInt(max);
			y = rp.nextInt(max);
			// mapita.colocarCasa(x, y, 'd');
			pedidos.add(new Pedido(x, y, 4, 1, 1));
		}
		return pedidos;
	}

	public static ArrayList<Vehiculo> GeneraVehiculos() {
		ArrayList<Vehiculo> v = new ArrayList<Vehiculo>();
		int i = 0;

		// creamos motos
		for (i = 0; i < Constantes.cantAuto; i++)
			v.add(new Vehiculo(i, Constantes.tipoAuto,
					Constantes.estVehiculoDisponible));

		// creamos autos
		for (int j = 0; j < Constantes.cantMoto; j++)
			v.add(new Vehiculo(i + j, Constantes.tipoMoto,
					Constantes.estVehiculoDisponible));

		return v;
	}
	
	
}

